-- Media.lua
-- Intégration LibSharedMedia (LSM) avec fallbacks propres si LSM n'est pas présent.
-- - Expose DFFT.LSM
-- - Enregistre les polices "maison" (DFFT.KNOWN_FONTS) dans LSM
-- - Fournit DFFT.FetchFontPath(name) => chemin prioritaire LSM, sinon fallback interne/Blizzard
-- - Fournit DFFT.ListAvailableFonts() => liste de noms LSM, sinon KNOWN_FONTS
-- - Callback DFFT.OnMediaFontRegistered(key) appelé quand de nouvelles polices sont enregistrées "à chaud"

local ADDON, DFFT = ...
if not DFFT then DFFT = {} end

local LSM = LibStub and LibStub("LibSharedMedia-3.0", true)
DFFT.LSM = LSM

-- Enregistrer les polices internes dans LSM (si présentes)
-- DFFT.KNOWN_FONTS peut être:
--   { ["Nom Lisible"] = "path\\to\\font.ttf" }   OU
--   { ["Nom Lisible"] = {path="...", file="...", name="..."} }
if LSM and type(DFFT.KNOWN_FONTS) == "table" then
  for name, val in pairs(DFFT.KNOWN_FONTS) do
    local path = val
    if type(val) == "table" then
      path = val.path or val.file or val.name
    end
    if type(path) == "string" and path ~= "" then
      pcall(LSM.Register, LSM, "font", name, path)
    end
  end
end

-- Helper interne : récupérer un chemin depuis KNOWN_FONTS (si non-LSM)
local function _fromKnownFonts(name)
  if type(DFFT.KNOWN_FONTS) ~= "table" then return nil end
  local v = DFFT.KNOWN_FONTS[name or ""]
  if type(v) == "table" then
    return v.path or v.file or v.name
  elseif type(v) == "string" and v ~= "" then
    return v
  end
  -- fallback interne "Teko Bold" si existante
  local def = DFFT.KNOWN_FONTS["Teko Bold"]
  if type(def) == "table" then return def.path or def.file or def.name end
  if type(def) == "string" and def ~= "" then return def end
  return nil
end

-- Récupérer le chemin pour SetFont()
function DFFT.FetchFontPath(fontName)
  -- 1) LibSharedMedia
  if LSM then
    local p = LSM:Fetch("font", fontName)
    if type(p) == "string" and p ~= "" then return p end
  end
  -- 2) Fallback: KNOWN_FONTS (chemins historiques)
  local q = _fromKnownFonts(fontName)
  if type(q) == "string" and q ~= "" then return q end
  -- 3) Blizzard par défaut
  return STANDARD_TEXT_FONT or "Fonts\\FRIZQT__.TTF"
end

-- Lister les polices disponibles pour le dropdown (noms)
function DFFT.ListAvailableFonts()
  local out = {}
  if LSM then
    local list = LSM:List("font")
    for i = 1, #list do out[#out+1] = list[i] end
  elseif type(DFFT.KNOWN_FONTS) == "table" then
    for k,_ in pairs(DFFT.KNOWN_FONTS) do out[#out+1] = k end
  end
  table.sort(out)
  return out
end

-- Callback: si des polices sont enregistrées après coup via LSM, on notifie l'addon
if LSM and LSM.RegisterCallback then
  LSM.RegisterCallback(DFFT, "LibSharedMedia_Registered", function(_, mediaType, key)
    if mediaType == "font" then
      if type(DFFT.OnMediaFontRegistered) == "function" then
        pcall(DFFT.OnMediaFontRegistered, key)
      end
    end
  end)
end
